考虑以下safeboolidiom的摘录:typedefvoid(Testable::*bool_type)()const;operatorbool_type()const;是否可以在没有typedef的情况下声明转换函数?以下不编译:operator(void(Testable::*)()const)()const; 最佳答案 啊,我只记得identity元函数。可以写operatortypenameidentity::type()const;identity的定义如下:templatestructidentity{typedef
显然,类型别名和模板化类型别名在语义上等同于typedef和typedef的扩展以支持模板。为什么会为这些创建带有using关键字的新语法,而不是使用typedefs作为第一个和一些带有单词typedef的语法扩展。注意:这不是“使用和typedef之间的区别”问题的克隆。我知道using具有定义一系列typedef的优势。我要问的是为什么标准的人决定让这个扩展使用using关键字而不是typedef关键字。这似乎只是增加了语言的困惑。 最佳答案 这里是BjarneStroustrup说他们为什么介绍using而不是扩展typede
考虑以下代码片段typedefinttype;intmain(){type*type;//whyisitallowed?type*k;//whichtype?}我得到一个错误'k'isnotdeclaredinthisscope。编译器将type*k解析为type*和k之间的乘法。这个语法是不是很困惑?为什么C++标准允许type*type?因为语法是这样说的?为什么? 最佳答案 type*type;//whyisitallowed?C++113.3.2/1说:Thepointofdeclarationforanameisimmed
如果我只想在未定义的情况下定义一个值,我会这样做:#ifndefTHING#defineTHINGOTHER_THING#endif如果THING是typedef的标识符,但没有定义怎么办?我想做这样的事情:#ifntypedefthing_typetypedefuint32_tthing_type#endif问题出现是因为我想检查外部库是否已经定义了boolean类型,但我愿意听取更通用的解决方案。 最佳答案 语言中没有这种东西,也不需要它。在单个项目中,您不应该有相同的typedef别名来引用不同的类型,因为这违反了ODR,如果
我偶然发现了一些代码,其中typedef关键字位于类型和别名之间,例如ininttypedefINT;它在gcc和clang(liveexample)中编译。我对标准语的理解不是很好。所以我的问题是:这个标准符合吗?我可以依靠编译器来支持它吗? 最佳答案 typedef关键字在C中被归类为存储类说明符,尽管标准明确指出这是为了方便表达形式语言语法。尽管如此,typedef可以出现在与任何其他存储类说明符(例如extern或static)完全相同的位置。[C2011,6.7.1/5]事实上,该语法允许存储类说明符与声明中的类型说明符、
我在typedef'ingboost::shared_ptr模板的命名约定之间来回切换。例如:typedefboost::shared_ptrFooPtr;在确定约定之前,我想看看其他人使用什么。你的约定是什么?编辑:对于那些将typedef嵌套在Foo中的人,Foo现在“知道”它的样子了绕过?它似乎打破了封装。这个怎么样:classFoo{public:typedefstd::vectorVector;};你现在不会这样做,对吗?:-) 最佳答案 回答:不要这样做。这对您和其他人都很方便。说出你的意思。
这个问题在这里已经有了答案:C++typesuffix_t,_typeornone(4个回答)关闭4年前。我很困惑何时应该将尾随_t添加到typedef的类型?例如,我应该这样做:typedefstructimageimage_t;或者这个:typedefstructimageimage;一般规则是什么?另一个例子,我应该这样做:typdefenum{ARRAY_CLOSED,ARRAY_OPEN,ARRAY_HALFOPEN}array_type_t;或者这个:typdefenum{ARRAY_CLOSED,ARRAY_OPEN,ARRAY_HALFOPEN}array_type;请
GCC已经有一段时间没有捕获我了,但它就发生在今天。但我从来不明白为什么GCC需要在模板中使用typedeftypename,而VS和我猜想ICC不需要。typedeftypename是“错误”还是过于严格的标准,还是留给编译器编写者的东西?对于那些不明白我的意思的人,这里有一个示例:templateboolfind(conststd::map&container,constKEY&key){std::map::const_iteratoriter=container.find(key);returniter!=container.end();}上面的代码在VS中编译(可能在ICC中)
我在一个项目中广泛使用shared_ptr和STL,这会导致类型过长、容易出错,例如shared_ptr>>(我偏爱是一名ObjC程序员,其中长名称是常态,但这仍然太多了。)我相信,始终将其称为FooListPtr会更清楚。并记录命名约定“Ptr”表示shared_ptr,“List”表示shared_ptr的vector。这很容易typedef,但它会导致标题令人头疼。我似乎有几个选项来定义FooListPtr:Foo.h.这会缠绕所有的header并造成严重的构建问题,因此它不是首发。FooFwd.h(“转发头”)。这就是EffectiveC++所建议的,基于iosfwd.h。这是
我在C++中发现了关键字typedef的新用法。这个typedef语句是什么意思?inttypedeffoo; 最佳答案 和这个一样typedefintfoo;即它将foo定义为int类型。虽然在这种情况下语法允许交换typedef和int,但您通常不会这样做,因为它会损害可读性。 关于c++-C++中不寻常的typedef使用,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/74